SECCON Beginners CTF 2022
チーム「Kaimin Kingdom」で参加しました
Aurora Suya Rhys Kaymin /ci7lus/ci7lus.icon
Debi Akuma /otofune/otofune.icon
Inori /rinsuki/rinsuki.icon
Eggplant Seal rokoucha.icon
https://scrapbox.io/files/629c3f7a6a4a5f001d0950cc.png
残念ながら私が解けた問題はありませんでした…
以下触った問題
web
textex
$ \LaTeX から PDF を生成するアプリケーションに対する攻撃
ただしコード中に flag が含まれる場合は pdf を生成しない
\input{} でファイル読み込みは出来るので flag を適当にエスケープできればよさそう
\input{fl\string\ag} でいけるっしょ→駄目でした
スコアサーバーはエラー内容を返してくれないので自分で建てる
しかし Docker が動かず…
しょうがないので直接 TexLive を入れた
確認するとどうやらファイル内の記号とかをエスケープしてないのでエラーが出ているらしい
どうしようかと思っていたらメンバーが解いてくれました
pwnable
BeginnersBof
win() 関数を呼び出すと flag が貰えるのでどうにかして呼びだそうという問題
fgets() で入力を受け取ってるので安心…かと思いきや何故か入力受付文字数を先に渡せてしまう
バッファサイズは 0x10 なので簡単にスタックバッファオーバーフローを狙えそう
objdump でターゲットの関数のアドレスを確認
main() が帰る時に win() の開始アドレスを RIP に捩じ込めるように入力を調整
していましたが全くうまくいかず、5時間ぐらい悩んでしまった
最終的にメンバーが解いてくれました
raindrop
またバッファオーバーフロー
だけど flag は自力で別ファイルから読み出す必要がある
スタックの中身を勝手にダンプしてくれる、ヒントらしいが…
どうすればいいか分からない!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2時間ぐらいうんうん唸ってた
いろいろググっていたら ROP とかいうのがあるらしい
pop rdi ; ret みたいなパターンを探してそいつを呼び出すことで RDI に任意のアドレスを書き込める
上のを gadget と言うらしい
RDI に任意のアドレスを書き込めれば好きな引数で関数を呼び出せる!
でもその後がずっと分からず3時間ぐらい停滞…
色々やってたら puts に実効ファイル内に含まれている好きな文字列を出させられるようになった
table: payload
領域 展開先 内容
0x00 - 0x15 バッファ なんか適当に
0x16 - 0x19 RBP とりあえず saved RBP
0x20 - 0x23 RIP gadget のアドレス
0x24 - 0x27 引数 適当な文字が入ってるアドレス
0x28 - 0x31 次の RIP puts のアドレス
こういう感じ
system の呼び出しがうまくいかないけど、呼び出せれば色々できそう
glibc に含まれているらしい /bin/sh の場所が分かればいいのでは?
メンバーが解いてくれました
system の PLT ではなく system を呼ぶ所のアドレスに飛ばせば system を間接的に呼べたらしい
バッファのアドレスが rbp - 0x20 である事に気付けたらしい
なのでバッファに /bin/sh を詰めて gadget で RDI に捩じ込み system を呼ぶコードに飛ばすと解けたとか
crypto
PrimeParty
3つ素数の入力を受け付けてなんかデカい数が出てくる
どうみても RSA なのでとりあえず n を素因数分解しようとした
でかすぎて無理でした
以下感想
とにかく知識不足、何も分からず終わった
コード書けなさすぎてずっと手作業でこねこねやってて時間が死ぬほどかかった
鳥頭すぎてどんな値を入れて試したか一瞬で忘れてしまった
解けなさすぎて鬱病になってグダグダ言うのはチームの士気が下がるのでさっさと抜けたほうがよかった
良い椅子と昇降机はあったほうがいい
もっとコード書いたほうが良いんだけど一日の半分以上を睡眠に費しているので時間がない!
!!!魔王城でおやすみをまだ見ていない!!!